/**
  ******************************************************************************
  * @author Chris
  * @since 2023/8/21 9:54
  *
  * @file     delay.c
  * @brief    The project will ...
  *
  * @note     ...
  *
  * @warning  Do not to ...
  ******************************************************************************
  * Change Logs:
  *   Date           Author       Notes
  *   2023/8/21     Chris        the first version
  *
  ******************************************************************************
  */

#include "delay.h"

/** region declare function region */

/** region declare function region */


/** region public function region */
/**
  * @brief  时钟摘取法延时函数（微秒）
  *
  * @note   系统滴答时钟（SysTick）是一个随着时钟周期不断递减，到 0 后自动重装的计数器。则当时钟频率为 6 MHz 时：
  *             1. SysTick 每计数一次的时间为：1/6 us
  *             2. 1 us 需要的计数次数为：1 / (1/6) = 6
  *
  *         出自 12.1.2 章：系统嘀嗒校准值被设为 6000，通过 SysTick 时钟置为 6MHz（ max fHCLK/8），给出了 1ms 的
  *         参考 time base。
  * @param  xus     待延时的微秒数（取值范围为 1~999）
  * @retval 无
  */
void delay_us(uint32_t xus) {
    SysTick->LOAD = 2 * xus - 1;
    SysTick->VAL = 0x00;
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

    uint32_t tmp;
    do {
        tmp = SysTick->CTRL;
    } while ((tmp & 0x01) && !(tmp & SysTick_CTRL_COUNTFLAG_Msk));

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
    SysTick->VAL = 0x00;
}

void delay_ms(uint32_t xms) {
    while (xms--)
        delay_us(1000);
}
/** region public function region */


/** region private function region */

/** region private function region */